﻿using Toolkit.Lib.CodeModels;
using Xceed.Document.NET;
using Xceed.Words.NET;

namespace Toolkit.Lib.Services;

/// <summary>
/// Word文件有关操作类
/// </summary>
public class WordDocumentService : IDisposable
{
    #region readonly prop

    private readonly DocX _document;
    private readonly Stream _stream;

    private readonly string[] _members =
    {
        "甲方：",
        "乙方：",
        "丙方：",
        "丁方：",
        "戊方：",
        "己方：",
        "庚方：",
        "辛方：",
        "壬方：",
        "癸方："
    };

    #endregion

    #region func

    /// <summary>
    /// 追加一段文本
    /// </summary>
    /// <param name="text">要追加的文本(Paragraph)</param>
    public void AppendText(string text)
    {
        _document.InsertParagraph(text).Font("宋体").FontSize(10.5).SpacingLine(12);
    }

    /// <summary>
    /// 保存文档
    /// </summary>
    /// <param name="headerText">页眉文本</param>
    /// <param name="footerText">页脚文本</param>
    public void Save(string headerText, string footerText)
    {
        //页眉
        _document.Headers.First.InsertParagraph(headerText);
        _document.Headers.Odd.InsertParagraph(headerText);
        _document.Headers.Even.InsertParagraph(headerText);

        //页脚
        _document.Footers.First.InsertParagraph(footerText).Alignment = Alignment.center;
        _document.Footers.Odd.InsertParagraph(footerText).Alignment = Alignment.center;
        _document.Footers.Even.InsertParagraph(footerText).Alignment = Alignment.center;

        //页码
        _document.Footers.First.InsertParagraph().AppendPageNumber(PageNumberFormat.normal).Alignment = Alignment.right;
        _document.Footers.Odd.InsertParagraph().AppendPageNumber(PageNumberFormat.normal).Alignment = Alignment.right;
        _document.Footers.Even.InsertParagraph().AppendPageNumber(PageNumberFormat.normal).Alignment = Alignment.right;

        _document.Save();
    }

    /// <summary>
    /// 生成并保存合同文档
    /// </summary>
    /// <param name="items">著作权人列表</param>
    /// <param name="softName">软件名</param>
    public void BuildAndSaveContract(List<MemberModel> items, string? softName)
    {
        //标题
        _document.InsertParagraph("合作开发合同书\n").Font("黑体").FontSize(25).Alignment = Alignment.center;

        //著作权人
        for (int i = 0; i < items.Count; i++)
        {
            string member = i > 9 ? "" : _members[i];
            _document.InsertParagraph($"{member}{items[i].Name} 身份证号:{items[i].ID}").Font("宋体").FontSize(12);
        }

        //正文
        _document.InsertParagraph(
                $"\n鉴于以上协议各方均为计算机软件专业开发人员，能够进行创造性的软件开发活动。并且协议各方有意愿共同从事{softName}的开发工作。 为了规范各方的权利义务，各方共同遵守\n")
            .Font("黑体").FontSize(12);

        _document.InsertParagraph("第一条、合作宗旨").Font("黑体").FontSize(14);
        _document.InsertParagraph($"\t为完成{softName}的开发工作，并共同享有开发成果而合作。").Font("宋体").FontSize(12);

        _document.InsertParagraph("第二条、合作项目和范围").Font("黑体").FontSize(14);
        _document.InsertParagraph($"\t协议各方共同开发{softName}，合作范围包括软件的代码 编写、调试、测试等开发工作。").Font("宋体").FontSize(12);

        _document.InsertParagraph("第三条、合作期限").Font("黑体").FontSize(14);
        _document.InsertParagraph("\t合作期限为一年。").Font("宋体").FontSize(13);

        _document.InsertParagraph("第四条、合作方式").Font("黑体").FontSize(14);
        _document.InsertParagraph("\t1. 协议各方按照软件编程工作的正常分工进行编写，任何一方不得随意更改软件的重大功能和事项，以免对其余各方造成履约困难。")
            .Font("宋体").FontSize(13);
        _document.InsertParagraph(
                "\t2. 合作各方应坚持勤勉努力诚实信用的原则，进行各方分别负责的软件的编程工作，并考虑到各方软件的兼容和接合。如部分合作人发生特殊技术困难，其余合作方有义务为其提供合理适当的技术帮助。")
            .Font("宋体")
            .FontSize(13);

        _document.InsertParagraph("第五条、知识产权").Font("黑体").FontSize(14);
        _document.InsertParagraph("\t1. 各方编写的软件源代码、技术文档及汇编而成的程序本身，其著作权均由合作方共同享有。").Font("宋体").FontSize(13);
        _document.InsertParagraph("\t2. 合作各方在编写软件的过程中，不得有侵犯他人知识产权的行为，否则，应对外承担全部侵 权责任。").Font("宋体").FontSize(13);

        _document.InsertParagraph("第六条、协议变更").Font("黑体").FontSize(14);
        _document.InsertParagraph("\t1. 经合作各方协商同意，本协议可以作相应变更;").Font("宋体").FontSize(13);
        _document.InsertParagraph("\t2. 任何合作方未经与其他各方协商，擅自变更本协议条款或者将本协议权利义务转让他人，均为无效。")
            .Font("宋体").FontSize(13);

        _document.InsertParagraph("第七条、禁止行为").Font("黑体").FontSize(14);
        _document.InsertParagraph("\t1. 未经全体合作人同意，禁止任何合作人私自以团体名义进行业务活动；如其业务获得利益则 归合作各方共有，造成损失按实际损失赔偿。")
            .Font("宋体").FontSize(13);
        _document.InsertParagraph("\t2. 禁止合作人经营与团队相竞争的业务。").Font("宋体").FontSize(13);
        _document.InsertParagraph("\t3. 禁止合作方泄露本协议所涉及的相关商业秘密。").Font("宋体").FontSize(13);
        _document.InsertParagraph("\t4. 如合作人违反上述各条，应按实际损失赔偿。").Font("宋体").FontSize(13);

        _document.InsertParagraph("第八条、合作的终止").Font("黑体").FontSize(14);
        _document.InsertParagraph("\t合作开发活动因以下事由之一得终止：").Font("宋体").FontSize(13);
        _document.InsertParagraph("\t①全体合作人同意终止合作关系；").Font("宋体").FontSize(13);
        _document.InsertParagraph("\t②合作项目因技术原因，根本不能完成；").Font("宋体").FontSize(13);
        _document.InsertParagraph("\t③合作项目违反法律被撤销。").Font("宋体").FontSize(13);

        _document.InsertParagraph("第九条、纠纷的解决").Font("黑体").FontSize(14);
        _document.InsertParagraph("\t合作各方之间如发生纠纷，应共同协商，本着有利于事业发展的原则予以解决。如协商不成，可以诉诸法院。")
            .Font("宋体").FontSize(13);

        _document.InsertParagraph("第十条").Font("黑体").FontSize(14);
        _document.InsertParagraph("\t本协议如有未尽事宜，应由合作人集体讨论补充或修改。补充各修改的内容与本协议具有同等效力。")
            .Font("宋体").FontSize(13);

        _document.InsertParagraph("第十一条").Font("黑体").FontSize(14);
        _document.InsertParagraph("\t本协议的扫描件及复印件与本协议具有同等效力。").Font("宋体").FontSize(13);

        _document.InsertParagraph("\n\n各方签字\n\n\n").Font("黑体").FontSize(13);
        _document.InsertParagraph("    年  月  日").Font("宋体").FontSize(13).Alignment = Alignment.right;

        _document.Save();
    }

    /// <summary>
    /// 释放资源
    /// </summary>
    public void Dispose()
    {
        _document.Dispose();
        _stream.Dispose();
    }

    #endregion

    /// <summary>
    /// 构造方法
    /// </summary>
    /// <param name="path">Word文档的路径</param>
    public WordDocumentService(string path)
    {
        _stream = new FileStream(path, FileMode.OpenOrCreate);
        _document = DocX.Create(_stream);

        _document.AddHeaders();
        _document.AddFooters();
    }
}